package singleton;

/**
 * 描述：双重检查（推荐面试使用）
 *
 * 优点：线程安全;延迟加载;效率较高。
 *
 * 为什么要double-check
 *   1.线程安全
 *   2.单check行不行？
 *   3.性能问题（synchronized加在方法上）
 *
 * 为什么要用volatile
 *  1.新建对象实际上需要有3个步骤
 *  2.重排序会带来NPE
 *  3.防止重排序
 *
 */
public class Singleton6 {

    private volatile static Singleton6 instance;

    private Singleton6() {

    }

    public static Singleton6 getInstance() {
        if (instance == null) {
            synchronized (Singleton6.class) {
                if (instance == null) {
                    instance = new Singleton6();
                }
            }
        }
        return instance;
    }
}
